package com.szrt.base;

import java.io.File;
import java.util.List;
import org.dom4j.Document;

/**
 * 实体类工具类
 * @author My
 *
 */
public class EntityUtil {
	
	
	/**
	 * 生成实体属性字段    如：private String id; private String typeName;
	 * @param types  数据库字段类型
	 * @param propertys 实体属性字段
	 * @return
	 */
	public static String generatePropertyFields(String[] types,String[] propertys){
		
		StringBuffer sb=new StringBuffer();
		
		for(int i=0;i<propertys.length;i++){
			// FieldUtil.sqlType2javaType()将数据库的类型装换成 java数据类型
			sb.append("private "+FieldUtil.sqlType2javaType(types[i])+" "+propertys[i]+";"+"\n");
		}
		return sb.toString();
	}
	
	/**
	 * 生成get的方法    如： public void setId(Integer id) {
								this.id = id;
							}
	 * @param types  数据库字段类型
	 * @param propertys  实体属性字段
	 * @return
	 */
	public static String generateGetMethod(String[] types,String[] propertys){
		
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<propertys.length;i++){
			
			// FieldUtil.sqlType2javaType()将数据库的类型装换成 java数据类型
			sb.append("public "+FieldUtil.sqlType2javaType(types[i])+" get"+FieldUtil.toUpperOne(propertys[i])+"(){"+"\n"+"\t"+"return "+propertys[i]+";"+"\n"+"}"+"\n");
		}
		return sb.toString();
	}
	
	/**
	 * 生成Set的方法    如：public void setId(Integer id) {
							this.id = id;
							}
	 * @param types  数据库字段类型
	 * @param propertys  实体属性字段
	 * @return
	 */
	public static String generateSetMethod(String[] types,String[] propertys){
		

		StringBuffer sb=new StringBuffer();
		for(int i=0;i<propertys.length;i++){
			sb.append("public void"+" set"+FieldUtil.toUpperOne(propertys[i])+"("+FieldUtil.sqlType2javaType(types[i])+" "+propertys[i]+"){"+"\n"+"\t"+"this."+propertys[i]+"="+propertys[i]+";"+"\n"+"}"+"\n");
		}
		return sb.toString();
	}
	
	/**
	 * 引入包
	 * @param packageName
	 * @return
	 */
	public static String importPackage(String Name){
		
		StringBuffer sb=new StringBuffer();
		sb.append("package "+Name+";"+"\n"+"\n");
		
		return sb.toString();
	}
	
	
	/**
	 * 生成类名    如：  public class Product{
	 * 
	 * @param tableName  数据库表的名字
	 * @return
	 */
	public static String generateClassName(String ClassName ){
		
		//将tableName装换成className   如:tmall_product_type_t ==>Product
		
		StringBuffer sb=new StringBuffer();
		sb.append("public class "+ClassName+"{"+"\n");
		
		return sb.toString();
	}
	
	/**
	 * 读取一个表生成一个实体类
	 * @param packageName 项目的名字 或者是包的名字
	 * @param tableName   表的名字
	 * @param generatePath 生成实体类的路径
	 * @throws Exception
	 */
	public static void generateEntity(String packageName,String tableName,String generatePath) throws Exception{

			
			//获得数据库表的字段数组    ID	 TYPE_NAME	FATHER_ID	IS_DELETE
			String[] fields = FieldUtil.getField(tableName);
			
			//获得表的字段属性   如:INT VARCHAR	DECIMAL	DECIMAL
			String[] types = FieldUtil.getTypes(tableName);
			
			//获得实体字段数组   如：IS_DELETE  =>isDelete
			String[] propertys = FieldUtil.getPropertys(fields);
			
			//生成class类名  如:tmall_product_type_t ==>Product
			String ClassName = FieldUtil.tableName2ClassName(tableName);
			
			
			/**
			 * 开始生成一个类
			 */
			//引入包名   如//com.szrt.tmall.Product.entity.xxx.java
			String importPackage = EntityUtil.importPackage(packageName+"."+ClassName.toLowerCase()+".entity");
//			System.out.println(importPackage);
			
			
//			String generatePath="src/main/java/";
			//生成文件的路径
		    File javaFile=new File(generatePath+FileUtils.mkdirsFormat(packageName+"/"+ClassName.toLowerCase()+".entity")+ClassName+"Entity"+".java"); 
			
		    //表名
		    ClassName +="Entity";
			
			//生成  public class Product{
			String generateClassName = EntityUtil.generateClassName(ClassName);
			
			//生成属性字段   private Integer id;
			String PropertyFields = EntityUtil.generatePropertyFields(types, propertys);
			
			//生成get的方法   
			String GetMethod = EntityUtil.generateGetMethod(types, propertys);
			
			//生成set的方法
			String SetMethod = EntityUtil.generateSetMethod(types, propertys);
			
			// 将生成的字符串，拼接到 StringBuffer
			StringBuffer sb=new StringBuffer();
			sb.append(importPackage+generateClassName+PropertyFields+GetMethod+SetMethod+"\n"+"}");
			
			//生成的字符串
			String javatext=sb.toString(); 
			
			//实体类包名+类名    
//			String packageNameAndClassName=FileUtils.mkdirsFormat(packageName)+ClassName+".java";
			
		    
		    //生成java文件
		    FileUtils.generateJavaFile(javatext, javaFile);
		    
		    System.out.println("成功生成实体类: "+ClassName);
		}
	
	
	public static void table2Entity(String xmlPash,String generatePath) throws Exception{
		
		//读取xml文件得到document对象
		Document document = XmlUtil.getdocument(xmlPash);
		//拿到表的名字
		List<String> tableName = XmlUtil.getTableName(document);
		//拿到项目的名字
		String packageName = XmlUtil.getPackageName(document);
		
		//循环表，生成实体类
		for (String tablename : tableName) {
			EntityUtil.generateEntity(packageName,tablename,generatePath);
		}
	}

	
}
